package org.raymond.iworks.study.basic.feature;

public class OptionalTest {

    // NPE
    /*
    if(null == obj)
    if(null == user.getName() || "".equals(user.getName()))

    if (order != null) {
        Logistics logistics = order.getLogistics();
        if(logistics != null){
            Address address = logistics.getAddress();
            if (address != null) {
                Country country = address.getCountry();
                if (country != null) {
                    Isocode isocode = country.getIsocode();
                    if (isocode != null) {
                        return isocode.getNumber();
                    }
                }
            }
        }
    }
    */
    // 改进
    /*
     String result = Optional.ofNullable(order)
      .flatMap(order->order.getLogistics())
      .flatMap(logistics -> logistics.getAddress())
      .flatMap(address -> address.getCountry())
      .map(country -> country.getIsocode())
      .orElse(Isocode.CHINA.getNumber());
     */

    // 当你不确定你提供的东西,是不是为空的时候,一个好的习惯是不要返回null,否则调用者的代码将充满了null的判断.我们要把null消灭在萌芽中
    /*
    public Optional<String> getUserName() {
        return Optional.ofNullable(userName);
    }
     */

    // 要尽量的少使用Optional的get方法,它同样会让代码变丑
    /*
    Optional<String> userName = "xjjdog";
    String defaultEmail = userName.get() == null ? "":userName.get() + "@xjjdog.cn";
     */
    // Optional的使用需要保持一致.当其中的一环出现了断层,大多数编码者都会以模仿的方式去写一些代码,以便保持与原代码风格的一致
    /*
    Optional<String> userName = "xjjdog";
    String defaultEmail = userName
        .map(e -> e + "@xjjdog.cn")
        .orElse("");
     */
}
